<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 需求： 只用当用户满足以下条件，才能看阿宽的这篇文章： 
                掘金用户
                掘金等级1级以上
                前端开发
                吃瓜群众
   -->
  <script>
    // 普通做法 ifelse走天下
    // 策略模式做法  应用场景：表单验证、多个判断的操作
    // 定义 : 要实现某一个功能，有多种方案可以选择。我们定义策略，把它们一个个封装起来，并且使它们可以相互转换。
    // 工作列表
    const jobList = ['FE', 'BE']
    // 策略
    var strategies = {
      checkRole: value => value === 'juejin',
      checkGradeL: value => value >= 1,
      checkJob: value => jobList.includes(value),
      checkEatType: value => value === 'eat melons'
    }
    // 校验
    const Validate = function () {
      this.cache = []
      this.add = function(value, method) {
        this.cache.push(function () {
            return strategies[method](value)
          }
        )
      }
      this.check = function () {
        for(let i = 0; i < this.cache.length; i++) {
          let result = this.cache[i]()
          if(!result) return false
        }
        return true
      }
    }
    // 满足 掘金用户、等级大于1的条件
    const compose1 = () => {
      const validate = new Validate()
      validate.add('juejin', 'checkRole')
      validate.add(1, 'checkGradeL')
      return validate.check()
    }
    console.log(compose1());

    // 满足 掘金用户、前端开发工作的条件
    const compose2 = () => {
      const validate = new Validate()
      validate.add('juejin', 'checkRole')
      validate.add('BE', 'checkJob')
      return validate.check()
    }
    console.log(compose2());
  </script>
</body>
</html>